package com.feri.shop.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.feri.shop.dao.OrderPayDao;
import com.feri.shop.dao.PayLogDao;
import com.feri.shop.dto.OrderPayDto;
import com.feri.shop.entity.OrderPay;
import com.feri.shop.entity.PayLog;
import com.feri.shop.service.intf.PayService;
import com.feri.shop.util.AliPayUtils;
import com.feri.shop.util.StringUtils;
import com.feri.shop.vo.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class PayServiceImpl implements PayService {
    @Autowired
    private OrderPayDao dao;
    @Autowired
    private PayLogDao logDao;

    //下单-生成支付信息
    @Override
    @Transactional//开启事务
    public R createPay(OrderPayDto dto){
        //1.验证
        if(dto!=null && StringUtils.isNotEmpty(dto.getTitle(),dto.getNo())){
            //2.发起支付
            String txt= AliPayUtils.createPayPc(dto.getNo(),dto.getPaymoney(),dto.getTitle());
            //3.验证调用结果
            if(StringUtils.isNotEmpty(txt)){
                //4.记录数据库
                OrderPay pay=new OrderPay(dto.getNo(),dto.getTitle(),dto.getPaymoney(),txt);
                dao.insert(pay);
                //5.记录操作日志
                logDao.insert(new PayLog(pay.getId(),1,"创建订单的支付信息"));
                //6.返回表单信息
                return R.ok(txt);
            }
        }
        return R.fail("请求失败，请检查参数！");
    }
    //查询订单的支付状态
    @Override
    @Transactional//开启事务
    public R queryPay(String no){
        //1.验证
        if(StringUtils.isNotEmpty(no)){
            //2.构建查询条件，查询订单支付信息
            QueryWrapper<OrderPay> queryWrapper=new QueryWrapper<>();
            queryWrapper.eq("no",no);
            OrderPay pay=dao.selectOne(queryWrapper);
            //3.验证是否有支付信息
            if(pay!=null){
                //4.验证支付状态
                if(pay.getFlag()==1){//如果是未支付，需要查询支付宝，获取真实的支付信息
                    //5.未支付状态，需要查询支付宝
                    String r=AliPayUtils.queryPay(no);
                    //6.验证支付结果，判断是否需要更改数据库状态
                    if(!r.equals("WAIT_BUYER_PAY")){
                        int f=1;
                        switch (r){
                            case "TRADE_CLOSED":f=2;break;
                            case "TRADE_SUCCESS":f=3;break;
                            case "TRADE_FINISHED":f=4;break;
                        }
                        //7.更改数据库的订单支付状态
                        dao.updateFlag(f,pay.getId());
                        pay.setFlag(f);
                        //8.记录日志
                        logDao.insert(new PayLog(pay.getId(),f,"比对支付状态，完成更新"));
                    }
                }
                return R.ok(pay);
            }else {
                return R.fail("亲，改订单还未有支付信息，请创建支付信息！");
            }
        }
        return R.fail("请求失败，请检查参数！");
    }
    //取消订单支付
    @Override
    @Transactional//开启事务
    public R closePay(String no){
        //1.验证
        if(StringUtils.isNotEmpty(no)){
            //2.构建查询条件，查询订单支付信息
            QueryWrapper<OrderPay> queryWrapper=new QueryWrapper<>();
            queryWrapper.eq("no",no);
            OrderPay pay=dao.selectOne(queryWrapper);
            //3.验证支付状态
            if(pay!=null && pay.getFlag()==1){
                //4.允许关闭，调用支付宝接口，完成支付关闭
                String r=AliPayUtils.closePay(no);
                if(StringUtils.isNotEmpty(r)){
                    //5.取消成功，更新数据库
                    dao.updateFlag(2,pay.getId());
                    //6.记录日志
                    logDao.insert(new PayLog(pay.getId(),2,"关闭订单支付"));
                    //7.返回消息
                    return R.ok();
                }else {
                    return R.fail("支付宝异常，关闭失败！");
                }
            }else {
                return R.fail("只能关闭未支付订单！");
            }
        }
        return R.fail("请求失败，请检查参数！");
    }
    //查询支付订单信息
    @Override
    public R queryAll(){
        return R.ok(dao.selectList(null));
    }
}
